package course.p5_stack;

/**
 * 栈的基础实现
 * 栈比较适合使用数组实现,因为使用数组实现栈的push，pop的时间复杂度都为O(1),且操作简单
 */
public class ArrayStack {

    /**
     * 存储栈顶元素的索引
     */
    private int top;

    /**
     * 栈的空间大小,默认起始为10
     */
    private int capacity = 10;

    /**
     * 存储栈元素的数组
     */
    private int[] array;

    /**
     * 无参构造方法
     */
    public ArrayStack() {
        array = new int[capacity];
        top = -1;
    }

    /**
     * 定义大小构造方法
     * @param a 定义栈的大小
     */
    public ArrayStack(int a) {
        capacity = a;
        array = new int[a];
        top = -1;
    }

    /**
     * 判断此栈是否为空
     * @return true--空 false--不空
     */
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 判断栈是否已满
     * @return
     */
    public boolean isStackFull() {
        return top == capacity-1;
    }

    /**
     * 将数据压入栈中
     * @param data
     */
    public void push(int data) {
        if(isStackFull()) {
            doubleStack();
        }
        array[++top] = data;
    }

    /**
     * 弹出栈顶元素
     * @return
     */
    public int pop() {
        if(isEmpty()) {
            System.out.println("Stack is Empty!");
            return -1;
        }
        else{
            return array[top--];
        }
    }

    /**
     * 删除栈
     */
    public void deleteStack() {
        top = -1;
        array = null;
        capacity = 0;
    }

    /**
     * 栈空间扩增方法
     */
    private void doubleStack() {
        int[] newArray = new int[capacity*2];
        System.arraycopy(array,0,newArray,0,capacity);
        capacity = capacity*2;
        array = newArray;
    }
}
